Scroll to navigation

stat(2) 2007-10-27-16:31 stat(2)

Назва

stat, fstat, lstat - одержують статус файлу

Стисло

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

int stat(const char *file_name, struct stat *buf);

int fstat(int filedes, struct stat *buf);

int lstat(const char *file_name, struct stat *buf);

Опис

Ці функції повертають інформацію про вказаний файл. Ви не зобов'язані володіти правами доступу до файлу, щоб отримати цю інформацію, тільки дозвіл на пошук тих каталогів, в якому знаходиться файл.

stat видасть статистику щодо файлу, на який вказує file_name, заповнюючи нею буфер buf.

lstat подібний до stat за винятком того, що у випадку символічного посилання, добувається інформація про саме посилання, а не файл, на який воно вказує.

fstat також схожий на stat , але статистичну інформацію можна отримати тільки щодо відкритого файлу (дивіться open(2)), на який вказує дескриптор filedes.

Усі вони повертають структуру stat, яка містить наступні поля:


struct stat {
dev_t st_dev; /* прилад */
ino_t st_ino; /* індексний номер */
mode_t st_mode; /* захист */
nlink_t st_nlink; /* кількість жорстких посилань */
uid_t st_uid; /* користувацький ID власника */
gid_t st_gid; /* ID групи власника */
dev_t st_rdev; /* тип приладу */
off_t st_size; /* загальний розмір, в байтах */
blksize_t st_blksize; /* розмір блоку для операцій вводу/виводу */
blkcnt_t st_blocks; /* кількість виділених блоків */
time_t st_atime; /* час останнього доступу */
time_t st_mtime; /* час останньої модифікації */
time_t st_ctime; /* час останньої зміни статусу */
};
Значення st_size містить розмір файлу в байтах (якщо це звичайний файл або символічне посилання). Розмір символічного посилання рівний довжині ланцюжка шляху, який він містить, без кінцевого NULL.

Значення st_blocks включає розмір файлу, розбитий на 512-байтові блоки. (Цей розмір може виявитись меншим за st_size/151, якщо файл містить дірки.) Значення st_blksize містить "бажаний" для ефективності операцій вводу/виводу розмір у блоках. (Запис до файлу менших відрізків може призвести до неефективного запису-модифікації-перезапису.)

Не кожна файлова система Лінукса втілює всі поля часу. Деякі файлові системи дозволяють приєднання в такий спосіб, що доступ до файлу не спричинює оновлення поля st_atime. (Дивіться аргумент "noatime" в посібнику mount(8).)

Поле st_atime змінюється після доступу до файлу, наприклад через execve(2), mknod(2), pipe(2), utime(2) і read(2) (якщо змінено більше за нуль байтів). Інші функції, такі як mmap(2) наприклад, можуть, а можуть і не оновлювати st_atime.

Поле st_mtime змінюється модифікаціями файлу, наприклад за допомогою mknod(2), truncate(2), utime(2) і write(2) (якщо змінено більше за нуль байтів). Більше того, st_mtime каталогу змінюється у випадку створення або видалення файлів з цієї директорії. Поле st_mtime залишеться без змін, якщо поміняти власника або групу, кількість жорстких посилань тощо.

Поле st_ctime змінюється у випадку запису або встановлення даних індексного вузла (тобто, інформації про власника, групу, кількість посилань, режим, і так далі.)

Наступні макроси POSIX означено для перевірки типу файлу:


чи це звичайний файл?


чи це каталог?


чи це пристрій посимвольної передачі даних?


чи це блоковий пристрій?


чи це FIFO?


чи символічне посилання? (Немає в POSIX.1-1996.)


чи це сокет? (Немає в POSIX.1-1996.)

Наступні прапорці означено для поля st_mode:

"S_IFMT 017000": бітова маска для біт-полів файлового типу

"S_IFSOCK 0140000"

сокет

"S_IFLNK 0120000"

символічне посилання

"S_IFREG 0100000"

звичайний файл

"S_IFBLK 0060000"

блоковий пристрій

"S_IFDIR 0040000"

каталог

"S_IFCHR 0020000"

посимвольний пристрій

"S_IFIFO 0010000"

fifo

"S_ISUID 0004000"

встановлює біт UID

"S_ISGID 0002000"

встановлює біт GID

"S_ISVTX 0001000"

стійкий біт

"S_IRWXU 00700"

користувацька маска дозволів

"S_IRUSR 00400"

власник має дозвіл на читання

"S_IWUSR 00200"

власник має дозвіл на запис

"S_IXUSR 00100"

власник має дозвіл на виконання

"S_IRWXG 00070"

маска дозволів для групи

"S_IRGRP 00040"

група має довіл на читання

"S_IWGRP 00020"

група має дозвіл на запис

"S_IXGRP 00010"

група має дозвіл на виконання

"S_IRWXO 00007"

маска дозволів для решти користувачів (тих, хто не належать до групи)

"S_IROTH 00004"

решта має довіл на читання

"S_IWOTH 00002"

решта має довіл на запис

"S_IXOTH 00001"

решта має дозвіл на виконання

Встановлення біту GID (S_ISGID) має декілька значень. Для каталогу він означає, що використовуватиметься семантика BSD - створені там файли успадковують ID групи цього каталогу, а не згідно з чинним ID процесу, що створив файл. Створені там каталоги також отримають встановлений біт S_ISGID. Інше - для файлів, які не мають встановленим біт виконання групою (S_IXGRP), GID вказує на обов'язкове блокування файлу (реєстраційного запису).

Стійкий біт (S_ISVTX) у випадку каталогу означає, що файл у цьому каталозі може перейменувати або видалити тільки власник файлу, власник каталогу і root-користувач.

Повернені значення

При вдалому виконанні, повертається нуль. У випадку помилки, буде повернено -1 і errno набуде відповідного значення.

Коди помилок


поганий дескриптор filedes .


Якась складова назви шляху file_name не існує, або шлях вказано як порожній ланцюжок.


Якась складова назви шляху не є каталогом.


Забагато символічних посилань під час спроби розв'язання шляху.


Погана адреса.


Відмова у доступі.


Недостатньо пам'яті (ядра).


Назва файлу занадто довга.

Відповідність стандартам

Виклики stat і fstat узгоджуються з SVr4, SVID, POSIX, X/OPEN, BSD 4.3. Виклик lstat відповідає 4.3BSD і SVr4. SVr4 згадує додаткові помилки fstat - EINTR, ENOLINK і EOVERFLOW, а для stat і lstat - EACCES, EINTR, EMULTIHOP, ENOLINK і EOVERFLOW. Використання полів st_blocks і st_blksize може виявитись не настільки портабельним. (Вони з'явилися в BSD і не згадуються POSIX. Їхня інтерпретація відрізняється в різних системах, і, можливо, на тій самій системі, коли приєднано файлову систему NFS.)

У POSIX немає опису бітів S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, S_ISVTX, зате вимагається використання макросів S_ISDIR() тощо. Макросів S_ISLNK і S_ISSOCK немає в POSIX.1-1996, зате очікуються в наступному виданні стандарту; перший макрос походить з SVID 4v2, тоді як другий - з SUSv2.

Unix V7 (і пізніші версії) мали S_IREAD, S_IWRITE, S_IEXEC, тоді як POSIX приписує синоніми S_IRUSR, S_IWUSR, S_IXUSR.

Інші системи

Значення, що використовувались (або надалі використовуються) на різноманітних системах:

шістн. назва вивід ls вісімк. опис

________________________________________


маска для типу файлу

0000 000000

непридатний індексний вузол (SCO); невідомий тип (BSD); SVID-v2 і XPG2 мають обидва, 0 і 0100000 для звичайних файлів

1000 S_IFIFO p| 010000

fifo (іменований конвеєр)

2000 S_IFCHR c 020000

посимвольний пристрій (V7)

3000 S_IFMPC 030000

мутьтиплексний посимвольний пристрій (V7)

4000 S_IFDIR d/ 040000

каталог (V7)

5000 S_IFNAM 050000

іменований файл XENIX з двома підтипами, що розрізняються значеннями st_rdev, рівними 1 і 2:

0001 S_INSEM s 000001

семафорний IFNAM-підтип (XENIX)

0002 S_INSHD m 000002

IFNAM-підтип спільних даних (XENIX)

6000 S_IFBLK b 060000

блочний пристрій (V7)

7000 S_IFMPB 070000

мультиплексний блочний пристрій (V7)

8000 S_IFREG - 100000

звичайний файл (V7)

9000 S_IFCMP 110000

стиснений файл VxFS

9000 S_IFNWK n 110000

спеціальний мережний файл (HP-UX)


символічне посилання (BSD)


тіньовий і-вузол для ACL (невидимий з користувацького простору) (Solaris)


сокет (BSD); так само S_IFSOC на VxFS)


"дверцята" Solaris


whiteout BSD (не використовується для і-вузла)

0200 S_ISVTX 001000

\&"стійкий біт": зберігає текст в свопі, навіть після використання (V7); резервований файл (SVID-v2); у випадку не-каталогів: не кешувати цей файл (SunOS); у випадку не-каталогів: прапорець обмеження видалення (SVID-v4.2)

0400 S_ISGID 002000

встановлює ID групи при виконанні (V7); у випадку каталогів: використовує семантуку BSD для встановлення ID групи

0400 S_ENFMT 002000

примусове блокування файлів SysV

0800 S_ISUID 004000

встановлює ID користувача при виконанні (V7)

0800 S_CDF 004000

каталог являється файлом, залежним від контексту (HP-UX)

Стійкий біт з'явився у Версії 32V UNIX-а від AT&T.

Дивіться також

chmod(2), chown(2), readlink(2), utime(2)

2007-10-27-16:31 © 2005-2007 DLOU, GNU FDL